home *** CD-ROM | disk | FTP | other *** search
/ isnet Internet / Isnet Internet CD.iso / prog / hiz / 09 / 09.exe / adynware.exe / perl / lib / site / Bit / primes.pl next >
Encoding:
Perl Script  |  1999-12-28  |  1.9 KB  |  94 lines

  1.  
  2. use strict;
  3. use vars qw($limit $set $start $stop $min $max $norm $i $j);
  4.  
  5. use Bit::Vector;
  6.  
  7. print "\n***** Calculating Prime Numbers - The Sieve Of Erathostenes *****\n";
  8.  
  9. $limit = 0;
  10.  
  11. if (-t STDIN)
  12. {
  13.     while ($limit < 16)
  14.     {
  15.         print "\nPlease enter an upper limit (>15): ";
  16.         $limit = <STDIN>;
  17.         if ($limit =~ /^\s*(\d+)\s*$/) { $limit = $1; } else { $limit = 0; }
  18.     }
  19.     print "\n";
  20. }
  21. else
  22. {
  23.     $limit = 100;
  24.     print "\nRunning in batch mode - using $limit as upper limit.\n\n";
  25. }
  26.  
  27. $set = Bit::Vector->new($limit+1);
  28.  
  29. $set->Fill();
  30.  
  31. $set->Delete(0);
  32. $set->Delete(1);
  33.  
  34. print "Calculating the prime numbers in the range [2..$limit]...\n\n";
  35.  
  36. $start = time;
  37.  
  38. for ( $j = 4; $j <= $limit; $j += 2 ) { $set->Delete($j); }
  39.  
  40. for ( $i = 3; ($j = $i * $i) <= $limit; $i += 2 )
  41. {
  42.     for ( ; $j <= $limit; $j += $i ) { $set->Delete($j); }
  43. }
  44.  
  45. $stop = time;
  46.  
  47. &print_elapsed_time;
  48.  
  49. $min = $set->Min();
  50. $max = $set->Max();
  51. $norm = $set->Norm();
  52.  
  53. print "Found $norm prime numbers in the range [2..$limit]:\n\n";
  54.  
  55. for ( $i = $min, $j = 0; $i <= $max; $i++ )
  56. {
  57.     if ($set->contains($i)) { print "prime number #", ++$j, " = $i\n"; }
  58. }
  59.  
  60. print "\n";
  61.  
  62. exit;
  63.  
  64. sub print_elapsed_time
  65. {
  66.     my($flag) = 0;
  67.     my($sec,$min,$hour,$year,$yday) = (gmtime($stop - $start))[0,1,2,5,7];
  68.     $year -= 70;
  69.     print "Elapsed time: ";
  70.     if ($year > 0)
  71.     {
  72.         printf("%d year%s ", $year, ($year!=1)?"s":"");
  73.         $flag = 1;
  74.     }
  75.     if (($yday > 0) || $flag)
  76.     {
  77.         printf("%d day%s ", $yday, ($yday!=1)?"s":"");
  78.         $flag = 1;
  79.     }
  80.     if (($hour > 0) || $flag)
  81.     {
  82.         printf("%d hour%s ", $hour, ($hour!=1)?"s":"");
  83.         $flag = 1;
  84.     }
  85.     if (($min > 0) || $flag)
  86.     {
  87.         printf("%d minute%s ", $min, ($min!=1)?"s":"");
  88.     }
  89.     printf("%d second%s.\n\n", $sec, ($sec!=1)?"s":"");
  90. }
  91.  
  92. __END__
  93.  
  94.